package com.journaldev.threadpool.shareparam;

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**
 * Java多线程编程：变量共享分析（Thread）
 * http://www.cnblogs.com/xudong-bupt/archive/2013/05/22/3087864.html
 * 
 * @author:chenhs E-mail:hson08_chen@163.com
 * Created on 2017年9月25日 上午10:29:30
 */
public class Analy {

	public static void main(String[] args)  throws Exception{
		Num i = new Num(0);		//新建对象，准备传递给线程
	/*	
		new OwnThread(i).start();		//新建线程，并启动
		new OwnThread(i).start();		//新建线程，并启动
		
		System.out.println("主线程中i的值变为了："+ i.i);		//获取目前对象i的数值
		
		*/
		
		
		
		// 构造一个线程池
		ThreadPoolExecutor threadPool = new ThreadPoolExecutor(2, 5, 3,
				TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(1000),
				new ThreadPoolExecutor.AbortPolicy());// 等待队列满的时候，会抛出RejectedExecutionException异常
		
		threadPool.execute(new OwnThread(i));
		threadPool.execute(new OwnThread(i));
		threadPool.execute(new OwnThread(i));
		
		threadPool.shutdown();
		// 等待线程池中的消息都处理完毕，然后关闭
		try {
			// 最大等待时间（秒），防止一直无限循环下去。
			int timeout = 300;
			// 每次检查超时时间
			int waittime = 2;
			boolean loop = true;
			do {
				// 循环检查线程池中所有任务是否都完成，
				loop = !threadPool.awaitTermination(waittime, TimeUnit.SECONDS);
				timeout = timeout - waittime;
			} while (loop && timeout > 0);
			System.out.println("线程池所有任务已经完成。timeout=" + timeout);
		} catch (InterruptedException e) {
			System.out.println("等待邀约任务执行完过程中出现异常。");
			throw new Exception("邀约出现异常！");
		}
		
	}

}
